#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main()
{
    // 向显示器打印字符串的几种做法
    // C 库函数
    printf("hello printf\n");
    fprintf(stdout, "hello fprintf\n");
    fputs("hello fputs\n", stdout);
    
    // 系统调用
    const char *s = "hello write\n";
    write(1, s, strlen(s));

    fork();
    // 1.父子进程调用fclose，导致语言缓冲区被刷新两次到内核
    // 2.父子进程刷新缓冲区发生写时拷贝
    //fsync(1);
    // stdout在内核中的struct file只有一个内核缓冲区 只会刷新一次

    //close(1);
    //int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    //// stdout -> 1
    //printf("fd: %d\n", fd);
    //printf("hello printf\n");
    //// 在关闭内核缓冲区前，强制刷新语言缓冲区到指定文件的内核缓冲区
    //fflush(stdout);
    //// stdout -> fd buffer

    //// 调用系统调用关闭文件内核缓冲区，语言缓冲区无法刷新
    //close(fd);

    //fclose(stdout);

    // 用户缓冲区
    //char buffer[128];
    //const char *s = "log.txt";
    //int fd = open(s, O_RDONLY, 0666);
    //int ret = read(fd, buffer, sizeof(buffer));
    //if (ret < 0)
    //{
    //    perror("read");
    //}
    //printf("buffer: %s\n", buffer);
    return 0;
}
